package com.dy.design_pattern_study.decoration_mode.dome.second;

import com.dy.design_pattern_study.decoration_mode.dome.second.impl.ConcreteComponent;
import com.dy.design_pattern_study.decoration_mode.dome.second.impl.ConcreteDecoratorA;
import com.dy.design_pattern_study.decoration_mode.dome.second.impl.ConcreteDecoratorB;

/**
 * @CreateBy zhangdingyi
 * @Date 2023-03-13
 * @Content 装饰模式 简单的说装饰模式就是给 Component 动态的 扩展添加功能 即 开放-封闭原则
 * 1.创建一个基础接口，且创建一个实例 C
 * 2.创建一个扩建基础接口的接口，且创建A、B两个实例
 * 3.利用 A实例装饰 C，利用 B 实例装饰 A
 * 4.最后调用 Operation 方法，说明依旧有 C实例原先的方法未被覆盖
 */
public class OrnamentDome {
    public static void main(String[] args) {
        //最开始的装扮
        ConcreteComponent c = new ConcreteComponent();
        ConcreteDecoratorA a1 = new ConcreteDecoratorA();
        ConcreteDecoratorB b1 = new ConcreteDecoratorB();

        //装饰方法是 先用 ConcreteComponent实例化对象
        //然后再用 ConcreteDecoratorA 实例化 a1 来包装
        // c a1装扮 c
        a1.SetComponent(c);
        //ConcreteDecoratorA 实例化 b1 来包装 a1
        // b1 又装扮 a1 达到 多层装扮的效果（多层扩展）
        b1.SetComponent(a1);
        //最后执行
        b1.Operation();
    }
}
